from typing import Optional

from app.db import SessionLocal
from app.db.models import Post, User
from app.security import hash_password, manager
from sqlalchemy.orm import Session


def get_user_by_name(name: str, db: Session) -> Optional[User]:
    """
    根据给定的用户名查询数据库中的用户信息

    参数:
        name (str): 要查询的用户名
        db (Session): 当前激活的数据库会话

    返回:
        User 或 None: 如果找到用户，则返回用户对象；否则返回None
    """
    # 使用用户名查询User表中的第一条匹配记录
    user = db.query(User).filter(User.username == name).first()
    return user

@manager.user_loader()
def get_user(name: str):
    with SessionLocal() as db:
        return get_user_by_name(name, db)


def create_user(name: str, password: str, db: Session, is_admin: bool = False) -> User:
    """
    创建新用户对象并提交至数据库

    参数:
        name (str): 用户名
        password (str): 明文密码
        db (Session): 活动的数据库会话
        is_admin (bool, 可选): 用户是否为管理员，默认为False

    返回:
        新创建的用户对象。
    """
    # 对密码进行哈希处理以确保安全存储
    hashed_password = hash_password(password)
    # 创建User实例，密码已哈希处理，并指定是否为管理员
    new_user = User(username=name, password=hashed_password, is_admin=is_admin)
    # 将新用户对象添加到当前数据库会话
    db.add(new_user)
    # 提交事务，完成用户创建
    db.commit()
    # 返回新创建的用户
    return new_user

def create_post(text: str, owner: User, db: Session) -> Post:
    """
    创建新的帖子并将其保存至数据库

    参数:
        text (str): 帖子的文本内容
        owner (User): 帖子的作者，类型为User对象
        db (Session): 数据库会话对象，用于执行数据库操作

    返回:
        Post: 创建成功后的新帖子对象
    """
    # 创建Post实例，包含帖子内容和作者信息
    new_post = Post(text=text, owner=owner)
    # 将新帖子对象添加到数据库会话
    db.add(new_post)
    # 提交事务，确保帖子数据被保存到数据库
    db.commit()
    # 返回创建的帖子对象
    return new_post
